#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
typedef void (*func_t)();//这是void返回值的函数类型
#define num 5
func_t handlers[num+1];
void download()
{
    printf("我是一个下载任务\n");
}
void flush()
{
    printf("我是一个刷新任务\n");
}
void registerhandler(func_t h[],func_t f)
{
    int i=0;
    for(;i<num;i++)
    {
        if(h[i]==NULL) break;
    }
    if(i==num) return;
    h[i]=f;
    h[i+1]=NULL;
}
int main()
{
    registerhandler(handlers,flush);
    registerhandler(handlers,download);
    
    pid_t id =fork();
    if(id==0)
    {
        //子进程
        int cnt=99999999;
        for(;cnt>0;cnt--)
        {
            printf("我是子进程，pid:%d;ppid:%d\n",getpid(),getppid());
            sleep(1);
        }
        exit(10);
    }
    while(1)
    {
    int status=0;
    pid_t rid=waitpid(id,&status,WNOHANG);
    if(rid>0)
    {
        printf("wait success,rid:%d,exit code:%d\n",rid,status);
        break;
    }
    else if(rid==0)
    {
        int i=0;
        for(;handlers[i];i++)
        {
            handlers[i]();
        }
        printf("本轮调用结束，子进程没有退出\n");
        sleep(1);
    }
    else 
    {
        printf("wait fail,exitcode:%d:%s\n",errno,strerror(errno));
        break;
    }
    }
    return 0;
}

